"""
既然类可以多继承, 那么肯定会存在继承查找顺序问题

即相同的属性/方法, 如果多继承, 那么最先引用的是哪一个类

这里就要涉及到两个类别:

经典类: python2
新式类: python3
"""

# 经典类
# python2版本才会存在的类, 即不继承 object的类
# class Grand():  # 经典类
#     ...
#
# class Parent(Grand): # 经典类
#     ...
#
# class Grand(object):  # 新式类
#     ...
#
# class Parent(Grand): # 新式类
#     ...

# 新式类
"""
在python3中, 没有 经典类, 只会存在 新式类

因为python3的中类, 以及默认都是继承 object

根据类别不同, 有两种查找方式:

经典类: 深度优先
新式类: 广度优先

通过以下相同的代码来解析
"""
class Grand():
    ...
    def info(self):
        print("Grand")

class Parent1(Grand):
    ...
    def info(self):
        print("Parent1")

class Parent2(Grand):
    # ...
    def info(self):
        print("Parent2")


class Child(Parent1, Parent2):
    ...

child = Child()
child.info()

print(Child.__mro__)

# 深度优先
"""
查找顺序: Child -> Parent1 -> Grand -> Parent2

简单来说, 就是一条路走到黑, 先走的是最近的类, 也就是继承的最左边的类

通过最左边的类, 一直往上找, 找到它的最终父类为为止

如果找到最终的父类都没有找到, 才会从第二个继承的类开始往上找.

现在都是用的python3, 目前基本是看不到深度优先了, 有兴趣的可以单独装个python2来看看
"""

# 广度优先
"""
查找顺序: Child -> Parent1 -> Parent2 -> Grand

简单来说, 就是从左往右找, 先找同级, 如果同级没有, 就再找父类.

定义同级的方式是需要两个类都继承 同一个 父类.
"""